我這邊的說明和舉例其實都是 dbt Core 的部分,老實說 dbt Cloud 我也沒有好好玩過,所以先打個預防針,避免差異過大,造成誤導,如果有任何疑問或是我寫錯的,超級歡迎直接留言,我也在持續學習中~
{dbt_project_name}/
├── macros/
├── logs/
├── snapshots/
├── analyses/
├── seeds/
├── tests/
├── models/
├── target/
├── profile.yml
└── dbt_project.yml
models/
這是 dbt 最核心的部分。models/ 資料夾裡存放的是你的 SQL 查詢,這些查詢會根據你的設計生成資料表或檢視表,供其他分析使用。你可以進一步建立子資料夾來組織不同的模型,通常會依據資料庫中的不同資料表或模組來分類。例如,你可以為每個資料表建立不同的子資料夾(如 staging/ 或 marts/),這不僅方便管理,也有助於 dbt 高效地執行查詢。
models/
內部結構像下方範例,每一層裡面還會有 schema.yml
去定義 SQL 產生的 VIEW / TABLE 欄位細節。models/
├── staging/
| ├── schema.yml
| └── stg_users.sql
└── marts/
├── schema.yml
└── user_orders.sql
dbt_project.yml
這是專案的設定檔,定義專案的基本資訊(例如專案名稱、資料夾結構、模型路徑等),並且可以在這裡設定一些執行 dbt 的規則。這是讓 dbt 知道如何正確執行你的專案的關鍵檔案。
profile.yml
這個檔案是必需的,因為它設定資料庫的連接資訊,讓 dbt 知道怎麼連接到你的資料庫。不同的資料庫(例如 PostgreSQL、BigQuery 等)會有不同的設定格式,這是 dbt 與資料庫溝通的橋樑。
這個檔案通常不會存放在專案的根目錄中,而是放在 dbt 的全域設定目錄下(例如:
~/.dbt/profiles.yml
)
macros/
:這裡放的是一些共用的 SQL 函數或模板(與 Jinja 模板語言整合),讓你可以重複使用相同的程式碼,而不需要每次都重新撰寫。例如,你可以在這裡定義一個範本來過濾重複的資料,並在不同的模型中反覆使用。
Jinja 是一種現代的 Python 模板引擎,主要用於生成動態內容。它允許你將程式邏輯和資料分離,使得代碼更易於維護和重用。Jinja 提供了控制結構(如條件語句和迴圈)、變數替換、過濾器和宏等功能,這些功能在 dbt 中特別有用。
{{ }}
來顯示變數的值。SELECT *
FROM {{ ref('my_model') }}
{% macro generate_order_count_query(user_ids) %}
SELECT user_id, COUNT(order_id) AS order_count
FROM orders
WHERE user_id IN (
{% for id in user_ids %}
{{ id }}{% if not loop.last %}, {% endif %}
{% endfor %}
)
GROUP BY user_id
{% endmacro %}
-- 使用宏(macros)
{{ generate_order_count_query([1, 2, 3]) }}
snapshots/
:這個資料夾存放的是你對資料進行快照的查詢,當你需要追蹤資料的歷史變化時,這裡會非常有用。dbt 的 snapshots 功能允許你保存特定時間點的數據,並隨時間進行追蹤,這在分析數據變動(例如價格變動或狀態變更)時非常有幫助。使用 dbt snapshot
命令來執行。
analyses/
:這裡是放置分析 SQL 查詢的地方,通常這些分析結果不會成為資料庫中最終的資料表或檢視表,但可以幫助你理解數據或作為報告的一部分。這些查詢主要是幫助分析師或資料科學家做一些臨時的數據探索。
seeds/
資料夾中存放的是靜態的參考資料,這些資料可以透過 dbt seed
命令自動匯入到資料庫中成為表格。常見的使用場景是像國家代碼或幣別等固定不變的參考數據。
tests/
:這裡是放置測試邏輯的地方,通常用來檢查你的資料模型是否符合預期(例如:資料是否有重複、欄位值是否正確)。dbt 支持多種測試類型,除了檢查資料的唯一性和空值外,還可以進行關聯性測試(例如檢查外鍵關聯性),以確保資料庫的一致性和完整性。
target/
:這是 dbt 執行結果的存放區,系統會在運行時自動生成這個資料夾。這裡會存放一些結果檔案:
catalog.json
:這個檔案是數據字典,記錄每個模型的欄位和它們的資料型別。manifest.json
:這是 dbt 執行的詳細計劃,記錄了所有模型、來源、測試以及相關的元數據。index.html
:這是一個網頁入口,打開後可以查看生成的文件,包含模型、來源和測試的詳情。logs/
:當 dbt 執行時,會自動生成日誌檔案,記錄整個執行過程。這些日誌不僅包含查詢的執行紀錄,還包括查詢的性能資訊,幫助你診斷問題或進行查詢優化。
其實上面的資料夾結構都是
dbt init
初始化後會看到的,如果要另外命名也都可以,只需要在dbt_project.yml
設定清楚就好了,也會有其他大家習慣的用法,例如用data/
來放測試驗證資料,如果你想用test-data/
其實也都可以,會一個個介紹是為了讓新手同學們不要驚慌,先有個大概念,後續就會覺得 dbt 真是簡單好用
明天會帶大家開始一個 dbt 專案,也會詳細介紹 dbt_project.yml
和 profile.yml
的細節,還有環境的架設,接著應該後天就能講經典的 Jaffle Shop 了吧~